package main

import "fmt"

/*Go语言中的defer语句会将其后面跟随的语句进行延迟处理。
在defer归属的函数即将返回时，将延迟处理的语句按defer定义的逆序进行执行，
也就是说，先被defer的语句最后被执行，最后被defer的语句，最先被执行。*/
func Defer() {
	fmt.Println("start")
	defer fmt.Println(1)
	defer fmt.Println(2)
	defer fmt.Println(3)
	fmt.Println("end")
}

func f1() (x int) {
	//操作的是x的副本
	defer func(x int) int {
		x++
		return x
	}(x)
	return 5
}
func f2() (x int) {
	defer func(x *int) {
		(*x)++
	}(&x)
	return 5
}
func Calc(index string, a int, b int) int {
	ret := a + b
	fmt.Println(index, a, b, ret)
	return ret
}
func main() {
	/*fmt.Println(f2())*/
	a := 1
	b := 2
	defer Calc("1", a, Calc("10", a, b))
	a = 0
	defer Calc("2", a, Calc("20", a, b))
	b = 1
}
